package IO;

import java.io.*;
import java.util.Scanner;

public class 字节和字符流的案例 {
    public static void main(String[] args) {
        //1.提示并接收用户输入的源文件路径和目标位置路径
        System.out.println("请输入源文件路径");
        String f=new Scanner(System.in).nextLine();//复制什么
        System.out.println("请输入目录文件路径");
        String t=new Scanner(System.in).nextLine();//复制到哪
        //2.调用使用字符流复制文件的方法,传入刚刚接收到的两个参数
        // ZFCopy(f,t);
        //3.调用使用字节流复制文件的方法,传入刚刚接手到的两个参数
        ZJCopy(f,t);
        
    }

    private static void ZJCopy(String f,String t) {
        //1.定义在整个方法都生效的局部变量,注意手动初始化,值为null
        InputStream in=null;
        OutputStream out=null;
        //2.由于代码可能会抛出异常,所以需要完成try-catch-finally结构
        try{
            //3.创建一个高效字节输入流,传入得参数胡是目标文件的路径
            in=new BufferedInputStream(new FileInputStream(f));
            //3.1创建一个高效字节输出流,传入得参数是目标问价复制到哪的路径
            out=new BufferedOutputStream(new FileOutputStream(t));
            //4拿到流对象以后就可以做具体业务操作了
            //4.1定义变量用来记录读到的数据
            int b;
            //4.2,使用循环读取目标文件,直到返回值为-1,没有数据时循环结束
            while ((b=in.read())!=-1){
                out.write(b);//将本次循环读到的内容写出到指定位置的文件中
            }
            System.out.println("恭喜您!文件复制成功");
        }catch (Exception e){
            System.out.println("很抱歉!文件复制失败");
            e.printStackTrace();
        }finally {//必须执行的代码,两个流都需要关闭
            try {
                out.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            try {
                in.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }



    }

    //创建一个使用字符流复制文件的方法,注意:复制需要两个流对象
    private static void ZFCopy(String f, String t) {
        //1.定义在整个方法都生效的局部变量,注意手动初始化,值为null
        Reader in=null;
        Writer out=null;
        //2.由于代码可能会抛出异常,所以需要完成try-catch-finally结构
        try {
            //3.创建一个高效字符输入流,传入得参数是目标文件的路径
            in=new BufferedReader(new FileReader("f"));
            //3.1创建一个高效字符输出流,传入得参数是目标文件复制到哪的路径
            out=new BufferedWriter(new FileWriter("t"));
            //4拿到流对象以后就可以做具体业务操作了
            //4.1定义变量用来记录读取到的数据
            int b;
            //4.2使用while循环读取目录文件,直到返回值为-1,没有数据时循环结束
            while ((b=in.read())!=-1){//4.3读取源文件内容
                out.write(b); //4.4将本次循环读到的内容写出到指定位置的文件中
            }
            System.out.println("恭喜您!文件复制成功");
        }catch (Exception e){
            System.out.println("很抱歉!文件复制失败");
            e.printStackTrace();
        }finally {//一定会被执行到的代码需要放在finally中,比如关流操作
            /**
             * 关流是有顺序的:如果有多个流,最后创建的流最先关闭
             * 多条关流语句需要 各自tey catch
             */

            try {
                out.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            try {
                in.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

}
